/**
 * 该值是否为空
 * @param {Any} value
 * @returns {Boolean} 是空:true; 否:false;
 */
export function isEmpty(value) {
    if (value === '' || value === undefined || value === null) {
        return true
    }
    if (Array.isArray(value)) {
        return value.length === 0
    }
    if (value instanceof Map || value instanceof Set) {
        return value.size === 0
    }
    if (typeof value === 'object') {
        return Object.keys(value).length === 0
    }
    return false
}

/**
 * 获取精确的数据类型
 * typeof Symbol() -> symbol
   toString.call(Symbol()) -> [object Symbol]
   toString未使用call方法，this始终指向Object: toString(1)->"[object Object]"
   toString.call(document.getElementsByTagName('body'))->"[object HTMLCollection]"
 * @param {Any} value
 * @returns {String}
 */
export function getType(value) {
    return Object.prototype.toString.call(value).replace(/\[|\]/g, '').split(/\s/)[1]
}

/**
 * 判断数字
 * isNaN 非数字，返回true
 * toString.call(NaN): number
 * typeof NaN: number
 * isFinite(null): number
 * isFinite([]): number
 * @param {Number|String} value
 * @returns {Boolean} 是true，否false
 */
export function isNumber(value) {
    if (value === '' || value === undefined || value === null) return false
    return !isNaN(+value)
}

/**
 * 判断dom节点
 * @param {Any} value
 * @returns {Boolean} 是true，否false
 */
export function isDom(value) {
    return typeof HTMLElement !== 'undefined'
        ? value instanceof HTMLElement
        : value && typeof value === 'object' && value.nodeType
}

/**
 * 检查是否是可枚举属性
 * @param {Object} o
 * @param {String} k
 * @returns {Boolean} 是true，否false
 */
export function hasProp(o, k) {
    return Object.prototype.hasOwnProperty.call(o, k)
}
